Autogenerated HTML docs for v1.8.1-rc2-5-g252f9 
diff --git a/technical/racy-git.html b/technical/racy-git.html index fcc026e..bf6362d 100644 --- a/technical/racy-git.html +++ b/technical/racy-git.html 
@@ -2,15 +2,25 @@  "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">   <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">   <head>  -<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />  -<meta name="generator" content="AsciiDoc 8.5.2" />  +<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />  +<meta name="generator" content="AsciiDoc 8.6.8" />   <title>Use of index and Racy git problem</title>   <style type="text/css">  -/* Debug borders */  -p, li, dt, dd, div, pre, h1, h2, h3, h4, h5, h6 {  -/*  - border: 1px solid red;  -*/  +/* Shared CSS for AsciiDoc xhtml11 and html5 backends */  +  +/* Default font. */  +body {  + font-family: Georgia,serif;  +}  +  +/* Title font. */  +h1, h2, h3, h4, h5, h6,  +div.title, caption.title,  +thead, p.table.header,  +#toctitle,  +#author, #revnumber, #revdate, #revremark,  +#footer {  + font-family: Arial,Helvetica,sans-serif;   }     body {  @@ -35,13 +45,8 @@  color: #083194;   }    -tt {  - color: navy;  -}  -   h1, h2, h3, h4, h5, h6 {   color: #527bbd;  - font-family: sans-serif;   margin-top: 1.2em;   margin-bottom: 0.5em;   line-height: 1.3;  @@ -59,9 +64,11 @@  h3 + * {   clear: left;   }  +h5 {  + font-size: 1.0em;  +}     div.sectionbody {  - font-family: serif;   margin-left: 0;   }    @@ -77,45 +84,48 @@  ul, ol, li > p {   margin-top: 0;   }  +ul > li { color: #aaa; }  +ul > li > * { color: black; }    -pre {  +.monospaced, code, pre {  + font-family: "Courier New", Courier, monospace;  + font-size: inherit;  + color: navy;   padding: 0;   margin: 0;   }    -span#author {  +  +#author {   color: #527bbd;  - font-family: sans-serif;   font-weight: bold;   font-size: 1.1em;   }  -span#email {  +#email {   }  -span#revnumber, span#revdate, span#revremark {  - font-family: sans-serif;  +#revnumber, #revdate, #revremark {   }    -div#footer {  - font-family: sans-serif;  +#footer {   font-size: small;   border-top: 2px solid silver;   padding-top: 0.5em;   margin-top: 4.0em;   }  -div#footer-text {  +#footer-text {   float: left;   padding-bottom: 0.5em;   }  -div#footer-badges {  +#footer-badges {   float: right;   padding-bottom: 0.5em;   }    -div#preamble {  +#preamble {   margin-top: 1.5em;   margin-bottom: 1.5em;   }  -div.tableblock, div.imageblock, div.exampleblock, div.verseblock,  +div.imageblock, div.exampleblock, div.verseblock,   div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,   div.admonitionblock {   margin-top: 1.0em;  @@ -135,7 +145,6 @@  /* Block element titles. */   div.title, caption.title {   color: #527bbd;  - font-family: sans-serif;   font-weight: bold;   text-align: left;   margin-top: 1.0em;  @@ -157,13 +166,15 @@    div.sidebarblock > div.content {   background: #ffffee;  - border: 1px solid silver;  + border: 1px solid #dddddd;  + border-left: 4px solid #f0f0f0;   padding: 0.5em;   }     div.listingblock > div.content {  - border: 1px solid silver;  - background: #f4f4f4;  + border: 1px solid #dddddd;  + border-left: 5px solid #f0f0f0;  + background: #f8f8f8;   padding: 0.5em;   }    @@ -171,8 +182,8 @@  padding-left: 1.0em;   margin-left: 1.0em;   margin-right: 10%;  - border-left: 5px solid #dddddd;  - color: #777777;  + border-left: 5px solid #f0f0f0;  + color: #888;   }     div.quoteblock > div.attribution {  @@ -180,8 +191,9 @@  text-align: right;   }    -div.verseblock > div.content {  - white-space: pre;  +div.verseblock > pre.content {  + font-family: inherit;  + font-size: inherit;   }   div.verseblock > div.attribution {   padding-top: 0.75em;  @@ -254,35 +266,12 @@  margin-bottom: 0.1em;   }    -div.tableblock > table {  - border: 3px solid #527bbd;  -}  -thead, p.table.header {  - font-family: sans-serif;  - font-weight: bold;  -}   tfoot {   font-weight: bold;   }   td > div.verse {   white-space: pre;   }  -p.table {  - margin-top: 0;  -}  -/* Because the table frame attribute is overriden by CSS in most browsers. */  -div.tableblock > table[frame="void"] {  - border-style: none;  -}  -div.tableblock > table[frame="hsides"] {  - border-left-style: none;  - border-right-style: none;  -}  -div.tableblock > table[frame="vsides"] {  - border-top-style: none;  - border-bottom-style: none;  -}  -     div.hdlist {   margin-top: 0.8em;  @@ -339,25 +328,32 @@  min-width: 100px;   }    -  -@media print {  - div#footer-badges { display: none; }  +div.colist td {  + padding-right: 0.5em;  + padding-bottom: 0.3em;  + vertical-align: top;  +}  +div.colist td img {  + margin-top: 0.3em;   }    -div#toc {  +@media print {  + #footer-badges { display: none; }  +}  +  +#toc {   margin-bottom: 2.5em;   }    -div#toctitle {  +#toctitle {   color: #527bbd;  - font-family: sans-serif;   font-size: 1.1em;   font-weight: bold;   margin-top: 1.0em;   margin-bottom: 0.1em;   }    -div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {  +div.toclevel0, div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {   margin-top: 0;   margin-bottom: 0;   }  @@ -373,51 +369,173 @@  margin-left: 6em;   font-size: 0.9em;   }  -/* Workarounds for IE6's broken and incomplete CSS2. */    -div.sidebar-content {  - background: #ffffee;  - border: 1px solid silver;  - padding: 0.5em;  +span.aqua { color: aqua; }  +span.black { color: black; }  +span.blue { color: blue; }  +span.fuchsia { color: fuchsia; }  +span.gray { color: gray; }  +span.green { color: green; }  +span.lime { color: lime; }  +span.maroon { color: maroon; }  +span.navy { color: navy; }  +span.olive { color: olive; }  +span.purple { color: purple; }  +span.red { color: red; }  +span.silver { color: silver; }  +span.teal { color: teal; }  +span.white { color: white; }  +span.yellow { color: yellow; }  +  +span.aqua-background { background: aqua; }  +span.black-background { background: black; }  +span.blue-background { background: blue; }  +span.fuchsia-background { background: fuchsia; }  +span.gray-background { background: gray; }  +span.green-background { background: green; }  +span.lime-background { background: lime; }  +span.maroon-background { background: maroon; }  +span.navy-background { background: navy; }  +span.olive-background { background: olive; }  +span.purple-background { background: purple; }  +span.red-background { background: red; }  +span.silver-background { background: silver; }  +span.teal-background { background: teal; }  +span.white-background { background: white; }  +span.yellow-background { background: yellow; }  +  +span.big { font-size: 2em; }  +span.small { font-size: 0.6em; }  +  +span.underline { text-decoration: underline; }  +span.overline { text-decoration: overline; }  +span.line-through { text-decoration: line-through; }  +  +div.unbreakable { page-break-inside: avoid; }  +  +  +/*  + * xhtml11 specific  + *  + * */  +  +div.tableblock {  + margin-top: 1.0em;  + margin-bottom: 1.5em;   }  -div.sidebar-title, div.image-title {  - color: #527bbd;  - font-family: sans-serif;  +div.tableblock > table {  + border: 3px solid #527bbd;  +}  +thead, p.table.header {   font-weight: bold;  - margin-top: 0.0em;  - margin-bottom: 0.5em;  + color: #527bbd;  +}  +p.table {  + margin-top: 0;  +}  +/* Because the table frame attribute is overriden by CSS in most browsers. */  +div.tableblock > table[frame="void"] {  + border-style: none;  +}  +div.tableblock > table[frame="hsides"] {  + border-left-style: none;  + border-right-style: none;  +}  +div.tableblock > table[frame="vsides"] {  + border-top-style: none;  + border-bottom-style: none;   }    -div.listingblock div.content {  - border: 1px solid silver;  - background: #f4f4f4;  - padding: 0.5em;  +  +/*  + * html5 specific  + *  + * */  +  +table.tableblock {  + margin-top: 1.0em;  + margin-bottom: 1.5em;  +}  +thead, p.tableblock.header {  + font-weight: bold;  + color: #527bbd;  +}  +p.tableblock {  + margin-top: 0;  +}  +table.tableblock {  + border-width: 3px;  + border-spacing: 0px;  + border-style: solid;  + border-color: #527bbd;  + border-collapse: collapse;  +}  +th.tableblock, td.tableblock {  + border-width: 1px;  + padding: 4px;  + border-style: solid;  + border-color: #527bbd;   }    -div.quoteblock-attribution {  - padding-top: 0.5em;  +table.tableblock.frame-topbot {  + border-left-style: hidden;  + border-right-style: hidden;  +}  +table.tableblock.frame-sides {  + border-top-style: hidden;  + border-bottom-style: hidden;  +}  +table.tableblock.frame-none {  + border-style: hidden;  +}  +  +th.tableblock.halign-left, td.tableblock.halign-left {  + text-align: left;  +}  +th.tableblock.halign-center, td.tableblock.halign-center {  + text-align: center;  +}  +th.tableblock.halign-right, td.tableblock.halign-right {   text-align: right;   }    -div.verseblock-content {  - white-space: pre;  +th.tableblock.valign-top, td.tableblock.valign-top {  + vertical-align: top;   }  -div.verseblock-attribution {  - padding-top: 0.75em;  - text-align: left;  +th.tableblock.valign-middle, td.tableblock.valign-middle {  + vertical-align: middle;  +}  +th.tableblock.valign-bottom, td.tableblock.valign-bottom {  + vertical-align: bottom;   }    -div.exampleblock-content {  - border-left: 3px solid #dddddd;  - padding-left: 0.5em;  +  +/*  + * manpage specific  + *  + * */  +  +body.manpage h1 {  + padding-top: 0.5em;  + padding-bottom: 0.5em;  + border-top: 2px solid silver;  + border-bottom: 2px solid silver;  +}  +body.manpage h2 {  + border-style: none;  +}  +body.manpage div.sectionbody {  + margin-left: 3em;   }    -/* IE6 sets dynamically generated links as visited. */  -div#toc a:visited { color: blue; }  +@media print {  + body.manpage div#toc { display: none; }  +}  +  +   </style>   <script type="text/javascript">   /*<![CDATA[*/  -window.onload = function(){asciidoc.footnotes();}   var asciidoc = { // Namespace.     /////////////////////////////////////////////////////////////////////  @@ -459,7 +577,7 @@    function tocEntries(el, toclevels) {   var result = new Array;  - var re = new RegExp('[hH]([2-'+(toclevels+1)+'])');  + var re = new RegExp('[hH]([1-'+(toclevels+1)+'])');   // Function that scans the DOM tree for header elements (the DOM2   // nodeIterator API would be a better technique but not supported by all   // browsers).  @@ -479,6 +597,25 @@  }     var toc = document.getElementById("toc");  + if (!toc) {  + return;  + }  +  + // Delete existing TOC entries in case we're reloading the TOC.  + var tocEntriesToRemove = [];  + var i;  + for (i = 0; i < toc.childNodes.length; i++) {  + var entry = toc.childNodes[i];  + if (entry.nodeName.toLowerCase() == 'div'  + && entry.getAttribute("class")  + && entry.getAttribute("class").match(/^toclevel/))  + tocEntriesToRemove.push(entry);  + }  + for (i = 0; i < tocEntriesToRemove.length; i++) {  + toc.removeChild(tocEntriesToRemove[i]);  + }  +  + // Rebuild TOC entries.   var entries = tocEntries(document.getElementById("content"), toclevels);   for (var i = 0; i < entries.length; ++i) {   var entry = entries[i];  @@ -506,24 +643,44 @@  */     footnotes: function () {  - var cont = document.getElementById("content");  + // Delete existing footnote entries in case we're reloading the footnodes.  + var i;   var noteholder = document.getElementById("footnotes");  + if (!noteholder) {  + return;  + }  + var entriesToRemove = [];  + for (i = 0; i < noteholder.childNodes.length; i++) {  + var entry = noteholder.childNodes[i];  + if (entry.nodeName.toLowerCase() == 'div' && entry.getAttribute("class") == "footnote")  + entriesToRemove.push(entry);  + }  + for (i = 0; i < entriesToRemove.length; i++) {  + noteholder.removeChild(entriesToRemove[i]);  + }  +  + // Rebuild footnote entries.  + var cont = document.getElementById("content");   var spans = cont.getElementsByTagName("span");   var refs = {};   var n = 0;   for (i=0; i<spans.length; i++) {   if (spans[i].className == "footnote") {   n++;  - // Use [\s\S] in place of . so multi-line matches work.  - // Because JavaScript has no s (dotall) regex flag.  - note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];  + var note = spans[i].getAttribute("data-note");  + if (!note) {  + // Use [\s\S] in place of . so multi-line matches work.  + // Because JavaScript has no s (dotall) regex flag.  + note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];  + spans[i].innerHTML =  + "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +  + "' title='View footnote' class='footnote'>" + n + "</a>]";  + spans[i].setAttribute("data-note", note);  + }   noteholder.innerHTML +=   "<div class='footnote' id='_footnote_" + n + "'>" +   "<a href='#_footnoteref_" + n + "' title='Return to text'>" +   n + "</a>. " + note + "</div>";  - spans[i].innerHTML =  - "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +  - "' title='View footnote' class='footnote'>" + n + "</a>]";   var id =spans[i].getAttribute("id");   if (id != null) refs["#"+id] = n;   }  @@ -543,17 +700,41 @@  }   }   }  +},  +  +install: function(toclevels) {  + var timerId;  +  + function reinstall() {  + asciidoc.footnotes();  + if (toclevels) {  + asciidoc.toc(toclevels);  + }  + }  +  + function reinstallAndRemoveTimer() {  + clearInterval(timerId);  + reinstall();  + }  +  + timerId = setInterval(reinstall, 500);  + if (document.addEventListener)  + document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false);  + else  + window.onload = reinstallAndRemoveTimer;   }     }  +asciidoc.install();   /*]]>*/   </script>   </head>  -<body>  +<body class="article">   <div id="header">   <h1>Use of index and Racy git problem</h1>   </div>   <div id="content">  +<div class="sect1">   <h2 id="_background">Background</h2>   <div class="sectionbody">   <div class="paragraph"><p>The index is one of the most important data structures in git.  @@ -564,32 +745,32 @@  often does not, match the files in the working tree.</p></div>   <div class="paragraph"><p>There are cases git needs to examine the differences between the   virtual working tree state in the index and the files in the  -working tree. The most obvious case is when the user asks <tt>git  -diff</tt> (or its low level implementation, <tt>git diff-files</tt>) or  -<tt>git-ls-files --modified</tt>. In addition, git internally checks  +working tree. The most obvious case is when the user asks <code>git  +diff</code> (or its low level implementation, <code>git diff-files</code>) or  +<code>git-ls-files --modified</code>. In addition, git internally checks   if the files in the working tree are different from what are   recorded in the index to avoid stomping on local changes in them   during patch application, switching branches, and merging.</p></div>   <div class="paragraph"><p>In order to speed up this comparison between the files in the   working tree and the index entries, the index entries record the  -information obtained from the filesystem via <tt>lstat(2)</tt> system  +information obtained from the filesystem via <code>lstat(2)</code> system   call when they were last updated. When checking if they differ,  -git first runs <tt>lstat(2)</tt> on the files and compares the result  +git first runs <code>lstat(2)</code> on the files and compares the result   with this information (this is what was originally done by the  -<tt>ce_match_stat()</tt> function, but the current code does it in  -<tt>ce_match_stat_basic()</tt> function). If some of these "cached  +<code>ce_match_stat()</code> function, but the current code does it in  +<code>ce_match_stat_basic()</code> function). If some of these "cached   stat information" fields do not match, git can tell that the   files are modified without even looking at their contents.</p></div>  -<div class="paragraph"><p>Note: not all members in <tt>struct stat</tt> obtained via <tt>lstat(2)</tt>  -are used for this comparison. For example, <tt>st_atime</tt> obviously  +<div class="paragraph"><p>Note: not all members in <code>struct stat</code> obtained via <code>lstat(2)</code>  +are used for this comparison. For example, <code>st_atime</code> obviously   is not useful. Currently, git compares the file type (regular   files vs symbolic links) and executable bits (only for regular  -files) from <tt>st_mode</tt> member, <tt>st_mtime</tt> and <tt>st_ctime</tt>  -timestamps, <tt>st_uid</tt>, <tt>st_gid</tt>, <tt>st_ino</tt>, and <tt>st_size</tt> members.  -With a <tt>USE_STDEV</tt> compile-time option, <tt>st_dev</tt> is also  +files) from <code>st_mode</code> member, <code>st_mtime</code> and <code>st_ctime</code>  +timestamps, <code>st_uid</code>, <code>st_gid</code>, <code>st_ino</code>, and <code>st_size</code> members.  +With a <code>USE_STDEV</code> compile-time option, <code>st_dev</code> is also   compared, but this is not enabled by default because this member  -is not stable on network filesystems. With <tt>USE_NSEC</tt>  -compile-time option, <tt>st_mtim.tv_nsec</tt> and <tt>st_ctim.tv_nsec</tt>  +is not stable on network filesystems. With <code>USE_NSEC</code>  +compile-time option, <code>st_mtim.tv_nsec</code> and <code>st_ctim.tv_nsec</code>   members are also compared, but this is not enabled by default   because in-core timestamps can have finer granularity than   on-disk timestamps, resulting in meaningless changes when an  @@ -598,23 +779,25 @@  ([PATCH] Sync in core time granuality with filesystems,   2005-01-04).</p></div>   </div>  +</div>  +<div class="sect1">   <h2 id="_racy_git">Racy git</h2>   <div class="sectionbody">   <div class="paragraph"><p>There is one slight problem with the optimization based on the   cached stat information. Consider this sequence:</p></div>   <div class="literalblock">   <div class="content">  -<pre><tt>: modify 'foo'  +<pre><code>: modify 'foo'   $ git update-index 'foo'  -: modify 'foo' again, in-place, without changing its size</tt></pre>  +: modify 'foo' again, in-place, without changing its size</code></pre>   </div></div>  -<div class="paragraph"><p>The first <tt>update-index</tt> computes the object name of the  -contents of file <tt>foo</tt> and updates the index entry for <tt>foo</tt>  -along with the <tt>struct stat</tt> information. If the modification  -that follows it happens very fast so that the file&#8217;s <tt>st_mtime</tt>  +<div class="paragraph"><p>The first <code>update-index</code> computes the object name of the  +contents of file <code>foo</code> and updates the index entry for <code>foo</code>  +along with the <code>struct stat</code> information. If the modification  +that follows it happens very fast so that the file&#8217;s <code>st_mtime</code>   timestamp does not change, after this sequence, the cached stat   information the index entry records still exactly match what you  -would see in the filesystem, even though the file <tt>foo</tt> is now  +would see in the filesystem, even though the file <code>foo</code> is now   different.   This way, git can incorrectly think files in the working tree   are unmodified even though they actually are. This is called  @@ -626,9 +809,9 @@  <li>   <p>   When the cached stat information says the file has not been  - modified, and the <tt>st_mtime</tt> is the same as (or newer than)  - the timestamp of the index file itself (which is the time <tt>git  - update-index foo</tt> finished running in the above example), it  + modified, and the <code>st_mtime</code> is the same as (or newer than)  + the timestamp of the index file itself (which is the time <code>git  + update-index foo</code> finished running in the above example), it   also compares the contents with the object registered in the   index entry to make sure they match.   </p>  @@ -636,79 +819,83 @@  <li>   <p>   When the index file is updated that contains racily clean  - entries, cached <tt>st_size</tt> information is truncated to zero  + entries, cached <code>st_size</code> information is truncated to zero   before writing a new version of the index file.   </p>   </li>   </ol></div>   <div class="paragraph"><p>Because the index file itself is written after collecting all  -the stat information from updated paths, <tt>st_mtime</tt> timestamp of  +the stat information from updated paths, <code>st_mtime</code> timestamp of   it is usually the same as or newer than any of the paths the   index contains. And no matter how quick the modification that  -follows <tt>git update-index foo</tt> finishes, the resulting  -<tt>st_mtime</tt> timestamp on <tt>foo</tt> cannot get a value earlier  +follows <code>git update-index foo</code> finishes, the resulting  +<code>st_mtime</code> timestamp on <code>foo</code> cannot get a value earlier   than the index file. Therefore, index entries that can be   racily clean are limited to the ones that have the same   timestamp as the index file itself.</p></div>   <div class="paragraph"><p>The callers that want to check if an index entry matches the   corresponding file in the working tree continue to call  -<tt>ce_match_stat()</tt>, but with this change, <tt>ce_match_stat()</tt> uses  -<tt>ce_modified_check_fs()</tt> to see if racily clean ones are  +<code>ce_match_stat()</code>, but with this change, <code>ce_match_stat()</code> uses  +<code>ce_modified_check_fs()</code> to see if racily clean ones are   actually clean after comparing the cached stat information using  -<tt>ce_match_stat_basic()</tt>.</p></div>  +<code>ce_match_stat_basic()</code>.</p></div>   <div class="paragraph"><p>The problem the latter solves is this sequence:</p></div>   <div class="literalblock">   <div class="content">  -<pre><tt>$ git update-index 'foo'  +<pre><code>$ git update-index 'foo'   : modify 'foo' in-place without changing its size   : wait for enough time  -$ git update-index 'bar'</tt></pre>  +$ git update-index 'bar'</code></pre>   </div></div>   <div class="paragraph"><p>Without the latter, the timestamp of the index file gets a newer  -value, and falsely clean entry <tt>foo</tt> would not be caught by the  +value, and falsely clean entry <code>foo</code> would not be caught by the   timestamp comparison check done with the former logic anymore.  -The latter makes sure that the cached stat information for <tt>foo</tt>  +The latter makes sure that the cached stat information for <code>foo</code>   would never match with the file in the working tree, so later  -checks by <tt>ce_match_stat_basic()</tt> would report that the index entry  +checks by <code>ce_match_stat_basic()</code> would report that the index entry   does not match the file and git does not have to fall back on more  -expensive <tt>ce_modified_check_fs()</tt>.</p></div>  +expensive <code>ce_modified_check_fs()</code>.</p></div>   </div>  +</div>  +<div class="sect1">   <h2 id="_runtime_penalty">Runtime penalty</h2>   <div class="sectionbody">  -<div class="paragraph"><p>The runtime penalty of falling back to <tt>ce_modified_check_fs()</tt>  -from <tt>ce_match_stat()</tt> can be very expensive when there are many  +<div class="paragraph"><p>The runtime penalty of falling back to <code>ce_modified_check_fs()</code>  +from <code>ce_match_stat()</code> can be very expensive when there are many   racily clean entries. An obvious way to artificially create   this situation is to give the same timestamp to all the files in  -the working tree in a large project, run <tt>git update-index</tt> on  +the working tree in a large project, run <code>git update-index</code> on   them, and give the same timestamp to the index file:</p></div>   <div class="literalblock">   <div class="content">  -<pre><tt>$ date &gt;.datestamp  +<pre><code>$ date &gt;.datestamp   $ git ls-files | xargs touch -r .datestamp   $ git ls-files | git update-index --stdin  -$ touch -r .datestamp .git/index</tt></pre>  +$ touch -r .datestamp .git/index</code></pre>   </div></div>   <div class="paragraph"><p>This will make all index entries racily clean. The linux-2.6   project, for example, there are over 20,000 files in the working   tree. On my Athlon 64 X2 3800+, after the above:</p></div>   <div class="literalblock">   <div class="content">  -<pre><tt>$ /usr/bin/time git diff-files  +<pre><code>$ /usr/bin/time git diff-files   1.68user 0.54system 0:02.22elapsed 100%CPU (0avgtext+0avgdata 0maxresident)k   0inputs+0outputs (0major+67111minor)pagefaults 0swaps   $ git update-index MAINTAINERS   $ /usr/bin/time git diff-files   0.02user 0.12system 0:00.14elapsed 100%CPU (0avgtext+0avgdata 0maxresident)k  -0inputs+0outputs (0major+935minor)pagefaults 0swaps</tt></pre>  +0inputs+0outputs (0major+935minor)pagefaults 0swaps</code></pre>   </div></div>  -<div class="paragraph"><p>Running <tt>git update-index</tt> in the middle checked the racily  -clean entries, and left the cached <tt>st_mtime</tt> for all the paths  +<div class="paragraph"><p>Running <code>git update-index</code> in the middle checked the racily  +clean entries, and left the cached <code>st_mtime</code> for all the paths   intact because they were actually clean (so this step took about  -the same amount of time as the first <tt>git diff-files</tt>). After  +the same amount of time as the first <code>git diff-files</code>). After   that, they are not racily clean anymore but are truly clean, so  -the second invocation of <tt>git diff-files</tt> fully took advantage  +the second invocation of <code>git diff-files</code> fully took advantage   of the cached stat information.</p></div>   </div>  +</div>  +<div class="sect1">   <h2 id="_avoiding_runtime_penalty">Avoiding runtime penalty</h2>   <div class="sectionbody">   <div class="paragraph"><p>In order to avoid the above runtime penalty, post 1.4.2 git used  @@ -723,17 +910,17 @@  <div class="olist arabic"><ol class="arabic">   <li>   <p>  -Initial <tt>git add .</tt> of a large project.  +Initial <code>git add .</code> of a large project.   </p>   </li>   <li>   <p>  -<tt>git checkout</tt> of a large project from an empty index into an  +<code>git checkout</code> of a large project from an empty index into an   unpopulated working tree.   </p>   </li>   </ol></div>  -<div class="paragraph"><p>Note: switching branches with <tt>git checkout</tt> keeps the cached  +<div class="paragraph"><p>Note: switching branches with <code>git checkout</code> keeps the cached   stat information of existing working tree files that are the   same between the current branch and the new branch, which are   all older than the resulting index file, and they will not  @@ -753,10 +940,11 @@  2006.</p></div>   </div>   </div>  +</div>   <div id="footnotes"><hr /></div>   <div id="footer">   <div id="footer-text">  -Last updated 2011-11-15 13:45:02 PDT  +Last updated 2011-11-15 13:45:02 PST   </div>   </div>   </body>